using System.Reflection;
using System.IO;
using Newtonsoft.Json;
using System.Net;
using System.Diagnostics;

namespace AccessLogParser
{
    public class AppParamsHelper
    {
        private static readonly string _currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        private static readonly string _configPath = _currentDirectory + @"\appconfig.json";

        /*Получение параметров из конфигурационного файла*/
        public ConfigObject GetAppConfig() {
            
            try
            {
                using (StreamReader streamReader = new StreamReader(_configPath))
                {
                    return JsonConvert.DeserializeObject<ConfigObject>(streamReader.ReadToEnd());
                }
            }
            catch (System.Exception err)
            {
                return null;
                System.Console.WriteLine("ERROR ----> Ошибка при получении конфигурационного файла\n" + err.Message);
                Process.GetCurrentProcess().Kill();
            }
           

        }
    
        /*Получение параметров из командной строки*/
        public AppParams GetAppAgrs (string[] args) {
            
            AppParams result = new AppParams();

            try
            {
                if (args.Any())
                {
                    foreach (string item in args)
                    {
                        switch (item){
                            case "--file-log":
                                string currentFilePath = args[Array.IndexOf(args, item) + 1];
                                result.fileLog = currentFilePath.Replace("'", null);
                                break;
                            case "--file-output":
                                currentFilePath = args[Array.IndexOf(args, item) + 1];
                                result.fileOutput = currentFilePath.Replace("'", null);
                                break;
                            case "--address-start":
                                result.addressStart = args[Array.IndexOf(args, item) + 1];
                                break;
                            case "--address-mask":
                                result.addressMask = Convert.ToInt32(args[Array.IndexOf(args, item) + 1]);
                                break;
                            case "--time-start":
                                result.startTime = args[Array.IndexOf(args, item) + 1];
                                break;
                            case "--time-end":
                                result.endTime = args[Array.IndexOf(args, item) + 1];
                                break;  
                            case "--help":  
                                PrintInstruction();
                                Process.GetCurrentProcess().Kill();
                                break;
                        }
                    }
                    
                    try
                    {
                        if (result.addressMask is not null && result.addressStart is null)
                        {
                            System.Console.WriteLine("ERROR ----> Не задан параметр --address-start. Для справки введите команду --help");
                            Process.GetCurrentProcess().Kill();
                        }
                        
                        if (result.endTime is not null && result.startTime is null)
                        {
                            System.Console.WriteLine("ERROR ----> Не задан параметр --time-start. Для справки введите команду --help");
                            Process.GetCurrentProcess().Kill();
                        }
                        
                        if (result.endTime is null && result.startTime is not null)
                        {
                            result.endTime = DateTime.Now.ToString("dd-MM-yyyy");
                        }
                        
                        if (result.fileOutput is null)
                        {
                            System.Console.WriteLine(_currentDirectory + @"\temp");
                            result.fileOutput = _currentDirectory + @"\temp";
                        }

                        System.Console.WriteLine("INFO ----> Получены данные параметров: " + JsonConvert.SerializeObject(result));
                    }
                    catch (System.Exception err)
                    {
                        System.Console.WriteLine(err);
                    }

                }
                else
                {
                    System.Console.WriteLine("ERROR ----> Некорректно переданы параметры командной строки. Для справки введите команду --help");
                }
            }
            catch (System.Exception)
            {
                System.Console.WriteLine("ERROR ----> Некорректно переданы параметры командной строки. Для справки введите команду --help");
            }

            return result;

        }

        internal void PrintInstruction(){
            System.Console.WriteLine(@"
            Параметры:

            --file-log — путь к файлу с логами
            --file-output — путь к файлу с результатом
            --address-start —  нижняя граница диапазона адресов, необязательный параметр, по
            умолчанию обрабатываются все адреса
            --address-mask — маска подсети, задающая верхнюю границу диапазона десятичное
            число. Необязательный параметр. В случае, если он не указан, обрабатываются все
            адреса, начиная с нижней границы диапазона. Параметр нельзя использовать, если не
            задан address-start
            --time-start —  нижняя граница временного интервала
            --time-end — верхняя граница временного интервала, если не задана берется текущая дата. 
                         Нельзя использовать без задания параметра --time-start
            
            Инструкция к конфигурационному файлу: 

            logDateMask - задает формат даты и времени обозначенном в логе
            logDataPattern - регулрярное выражения для даты и времни в логе
            iPAddressPattern - регулряное выражение для ip-адреса в логе
            ");
        }
    
    }
}